package com.company.designmode.create.single;

/**
 * 双检索-单例模式
 * 双检索即双重锁校验,需要使用volatile+synchronized关键字
 *
 * JDK 版本：JDK1.5 起
 * 是否 Lazy 初始化：是
 * 是否多线程安全：是
 * 实现难度：较复杂
 * 描述：这种方式采用双锁机制，安全且在多线程情况下能保持高性能
 */
public class SingletonDCL {

    //volatile保证instance实例在多线程下的可见性
    private volatile static SingletonDCL instance;

    private SingletonDCL(){}

    public static SingletonDCL getInstance(){
        if (instance==null){
            // 判断对象是否以及实例化过，没有则进入加锁代码块，此处可能有多个线程同时进来，等待类对象锁
            synchronized (SingletonDCL.class){
                // 获取类对象锁，其他线程在外等待，其他线程进来再次判断，如果对象实例化了，则不需要再实例化
                if (instance==null){
                    instance = new SingletonDCL();
                }
            }
        }
        return instance;
    }
    public void showMessage(){
        System.out.println("Hello World!");
    }
}
